/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.evangelion.core.controller;

import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import com.evangelion.core.bean.Cliente;
import com.evangelion.core.bean.Profesor;
import com.evangelion.core.bean.Seccione;
import com.evangelion.core.bean.Vehiculo;
import com.evangelion.core.utils.MensajesFace;
import com.evangelion.core.utils.SeccionConverter;
import com.evangelion.core.utils.VehiculoConverter;

/**
 * @author Kellycasma
 */
@ManagedBean
@ViewScoped
public class ProfesorController extends MensajesFace implements Serializable {

    private Profesor profesor;

    private String valorBusqueda;

    private LazyDataModel<Profesor> listaProfesor;

    private List<Seccione> listaSeccion;

    private List<Vehiculo> listaVehiculo;

    private Date diffFecha;

    @PostConstruct
    public void init() {
        super.init();

        profesor = new Profesor();
        profesor.setCliente(new Cliente());
        profesor.setSeccion(new Seccione());
        profesor.setVehiculo(new Vehiculo());

        listaSeccion = SeccionConverter.linkTypesDB;
        listaVehiculo = VehiculoConverter.linkTypesDB;
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.YEAR, -10);
        diffFecha = calendar.getTime();
    }

    public void save() {
        if (validarForm()) {
            profesor.setCliente(usuario.getCliente());
            profesor.setSeccion(seccion);

//            if (profesor.getId() == null) {
//                profesor.setFechaCreacion(new Date());
//            }
//            profesor.setFechaActualizacion(new Date());
//            System.out.println("fechaactualizacion:"+profesor.getFechaActualizacion());
            profesorService.save(profesor);
            limpiarForm();
            msgCambiosGuardados();
            init();
        }
        System.out.println("imprimir" + profesor.getApellidos());
    }

    public void limpiarForm() {
        profesor = new Profesor();
    }

    public Profesor getProfesor() {
        return profesor;
    }

    public boolean validarForm() {
        boolean requerido = true;
        if (!validarNIF(profesor.getNif())) {
            msgValidacion("EL NIF");
            requerido = false;
        }
        try {
            Profesor profesorTemporal = profesorService.findObjByParam("nif", profesor.getNif());
            if (profesorTemporal != null) {
                if ((profesor.getId() == null || (!profesor.getId().equals(profesorTemporal.getId()) && profesor.getId() != null))) {
                    msgValidacion("Ya existe pertenece a " + profesorTemporal.getNombres());
                    requerido = false;
                } else {
                    if (profesor.getId() != null) {
                        profesor.setNif(profesorTemporal.getNif());
                    }
                }
            }
        } catch (Exception ex) {
            msgValidacion("Ha ocurrido un error");
            return false;
        }
        return requerido;
    }

    public void search() {
        System.out.println("...valorBusqueda" + valorBusqueda);
        configDataModel();
    }

    @SuppressWarnings("serial")
    public void configDataModel() {
        listaProfesor = new LazyDataModel<Profesor>() {
            @Override
            public List<Profesor> load(int start, int max, String arg2, SortOrder arg3, Map<String, String> arg4) {
                if (valorBusqueda == null) {
                    valorBusqueda = "";
                }

                return (List) profesorService.searchByNifNombre(seccion, valorBusqueda, start, max);
            }
        };
        listaProfesor.setRowCount(profesorService.countPage(seccion, valorBusqueda));
    }

    public static boolean validarNIF(String nif) {
        boolean correcto = false;
        Pattern pattern = Pattern.compile("(\\d{1,8})([TRWAGMYFPDXBNJZSQVHLCKEtrwagmyfpdxbnjzsqvhlcke])");
        Matcher matcher = pattern.matcher(nif);
        if (matcher.matches()) {
            String letra = matcher.group(2);
            String letras = "TRWAGMYFPDXBNJZSQVHLCKE";
            int index = Integer.parseInt(matcher.group(1));
            index = index % 23;
            String reference = letras.substring(index, index + 1);
            System.out.println("LETRA DEL NIF QUE DEBIERA SER:" + reference);
            if (reference.equalsIgnoreCase(letra)) {
                correcto = true;
            }
        }
        return true;
        //return correcto;
    }

    public String getValorBusqueda() {
        return valorBusqueda;
    }

    public LazyDataModel<Profesor> getListaProfesor() {
        return listaProfesor;
    }

    public void setListaProfesor(LazyDataModel<Profesor> listaProfesor) {
        this.listaProfesor = listaProfesor;
    }

    public void setValorBusqueda(String valorBusqueda) {
        this.valorBusqueda = valorBusqueda;
    }

    public void setProfesor(Profesor profesor) {
        this.profesor = profesor;
    }

    public List<Seccione> getListaSeccion() {
        return listaSeccion;
    }

    public void setListaSeccion(List<Seccione> listaSeccion) {
        this.listaSeccion = listaSeccion;
    }

    public List<Vehiculo> getListaVehiculo() {
        return listaVehiculo;
    }

    public void setListaVehiculo(List<Vehiculo> listaVehiculo) {
        this.listaVehiculo = listaVehiculo;
    }

    public Date getDiffFecha() {
        return diffFecha;
    }

    public void setDiffFecha(Date diffFecha) {
        this.diffFecha = diffFecha;
    }
}
